package com.file.manage.domain.service;

import com.file.manage.domain.data.FileTreeDTO;
import com.file.manage.domain.data.FileVO;
import com.file.manage.domain.entity.File;
import com.file.manage.domain.request.FileCopyMoveRequest;
import com.file.manage.domain.response.UploadTmpFileResponse;
import com.file.manage.infrastructure.base.service.BaseService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 文件管理 服务类
 *
 * @since 2025-05-22
 */
public interface FileService extends BaseService<File> {

    /**
     * 查询文件树
     */
    List<FileTreeDTO> selectTree(String pid);

    /**
     * 新建文件夹
     */
    void createFolder(String name, String parentId);

    /**
     * 修改文件夹名称
     *
     * @param id
     * @param name
     */
    void updateNameById(String id, String name);

    /**
     * 文件路径上传文件
     */
    void uploadFileByFolders(List<String> folders, String name, MultipartFile multipartFile) throws IOException;

    /**
     * 父级id上传文件
     */

    void uploadFileByParentId(String parentId, String name, MultipartFile multipartFile) throws IOException;

    /**
     * 上传临时文件
     */
    UploadTmpFileResponse uploadTmpFile(List<String> folders, String name, MultipartFile multipartFile) throws IOException;

    /**
     * 上传压缩包
     */
    void uploadZip(String parentId, MultipartFile multipartFile) throws IOException;

    /**
     * 临时文件转为正式文件
     */
    void tmp2FormalFile(List<UploadTmpFileResponse> responses) throws IOException;

    /**
     * 通过父级id获取文件列表
     */
    List<FileVO> getByParentId(String parentId);

    /**
     * 删除文件
     */
    void deleteById(String id);

    /**
     * 移动
     */
    void move(FileCopyMoveRequest request);

    /**
     * 通过文件id下载文件
     *
     * @param ids(文件id：拼接所有父级文件夹名称。文件夹id：以当前文件夹为根目录，保留文件夹路径，下载当前文件夹下所有文件夹与文件)
     * @param response
     */
    void downLoadFileByIds(List<String> ids, HttpServletResponse response) throws IOException;

    /**
     * 下载文件
     *
     * @param fileName
     * @param response
     * @param signal   0: 下载 1: 只预览
     */
    void downLoadFile(String filePath, String fileName, HttpServletResponse response, Integer signal);

    /**
     * 获取文件路径
     *
     * @param file
     * @return
     */
    String getPath(File file);

    String getPath(String id);

    /**
     * 替换文件
     *
     * @param id
     * @param name
     * @param multipartFilet
     */
    void replaceFile(String id, String name, MultipartFile multipartFilet) throws IOException;

    /**
     * 锁定文件
     */
    void lock(String id);

    /**
     * 解锁
     */
    void unlock(String id);

    void cancelDelTag(String id);

    void delTag(String id);
}
